package xiaomo.example.commoncore.entity;

import lombok.Data;
import xiaomo.example.commoncore.constant.ResultCode;

@Data
public class ResultWrapper<T>{
    /**
     * 操作状态
     */
    private boolean success;

    /**
     * 状态码
     */
    private int code;
    /**
     * 消息
     */
    private String message;

    /**
     * 数据
     */
    private T data;

    /**
     * 构造函数私有化
     */
    private ResultWrapper(){}

    /**
     * 有响应数据的响应成功方法
     * @param data
     * @return
     * @param <T>
     */
    public static <T> ResultWrapper<T> success(T data){
        return assemble(ResultCode.SUCCESS.getCode(),true,data);
    }

    /**
     * 没有响应数据的成功方法
     * @return
     * @param <T>
     */
    public static <T> ResultWrapper<T> success(){
        return success(null);
    }

    /**
     * 有响应数据的失败方法
     * @param data
     * @return
     * @param <T>
     */
    public static <T> ResultWrapper<T> error(T data){
        return assemble(ResultCode.SYSTEM_FAILURE.getCode(),false,data);
    }

    /**
     * 没有响应数据的失败方法
     * @return
     * @param <T>
     */
    public static <T> ResultWrapper<T> error(){
        return error();
    }

    public ResultWrapper<T> data(T data){
        this.setData(data);
        return this;
    }

    public ResultWrapper<T> code(int code){
        this.setCode(code);
        return this;
    }

    public ResultWrapper<T> message(String message){
        this.setMessage(message);
        return this;
    }

    public static <T> ResultWrapper<T> assemble(int code, boolean success, T data) {
        ResultWrapper<T> resultWrapper = new ResultWrapper<>();
        resultWrapper.setCode(code);
        resultWrapper.setSuccess(success);
        resultWrapper.setData(data);
        return resultWrapper;
    }
}
